Как я могу вернуть количество слов в результирующем документе для расчета TF - PullRequest
0 голосов
/ 03 ноября 2010

Я поставил перед собой задачу создать базовый механизм поиска текстовых файлов в PHP за очень ограниченное время, практически не имея предшествующих знаний в области программирования, это довольно сложная задача!

Вот что у нас такдалеко, ему удается вернуть документ (ы) - если их более одного с одинаковым количеством) с наибольшим числом вхождений слова.

Проблема в том, как мы это делали, не (по крайней мере)не легко) позволяют рассчитать балл TF-IDF.IDF готов, но нам нужно вычислить TF, получив общее количество слов в возвращенном документе, и это то, с чем у нас проблемы.Другая проблема заключается в том, что он возвращает только самый высокий документ, и мы не можем заставить его вернуть список документов, каждый из которых имеет свою оценку .... т.е. один документ имеет слово "авиакомпания" в 3 раза, два других документа имеют его один раз.и они забываются, и возвращается только первое ...

(были также некоторые проблемы с удалением символов, но мы работали над этим, хотя и методом вытягивания ...)

Вот что мы имеем:

<code><?php
$starttime = microtime();
$startarray = explode(" ", $starttime);
$starttime = $startarray[1] + $startarray[0];

if(isset($_GET['search']))
{
    $searchWord = $_GET['search'];
}
else
{
    $searchWord = null;
}

?>
<html>
<link href="style.css" rel="stylesheet" type="text/css">
<body>
<div id="wrapper">
    <div id="searchbar">
        <h1>PHP Search</h1>
        <form name='searchform' id='searchform' action='<?php echo $_SERVER['PHP_SELF']; ?>' method='get'>
          <input type='text' name='search' id='search' value='<?php echo $_GET['search']; ?>' />
            <input type='submit' value='Search' />
        </form>
        <br />
        <br />
    </div><!-- close searchbar -->
    <?php


//path to directory to scan
$directory = "./files/";

//get all image files with a .txt extension.
$files = glob("" . $directory . "*.txt");
$fileList = array();
//print each file name
foreach($files as $file)
{
$fileList[] =  $file;
}
//$fileList;


        function indexFile($file){
            $filename = $file;
            $fp = fopen($filename, 'r');
            $file_contents = fread($fp, filesize($filename));
            fclose($fp);

            $pat[0] = "/^\s+/";
            $pat[1] = "/\s{2,}/";
            $pat[2] = "/\s+\$/";
            $rep[0] = "";
            $rep[1] = " ";
            $rep[2] = "";

            $new_contents = preg_replace("/[^A-Za-z0-9\s\s+]/", "", $file_contents);
            $new_contents = preg_replace($pat, $rep, $new_contents);

            //COMMON WORDS WERE HERE
            include "commonwords.php";

            $lines = explode("\n", $new_contents);
            $lines2 = implode(" ", $lines); //string
            $lines2 = strtolower($lines2);

            //echo $lines2 . "<br><br>";

            $words = explode(" ", $lines2); //array
            //$words = $lines;
            $useful_words = array_diff($words, $commonWords);
            $useful_words = array_values($useful_words);
            print_r(count($useful_words));

            //echo '<pre>';
            $index = array_count_values($useful_words);
            arsort($index, SORT_NUMERIC);
            //print_r($index);
            //echo '
';вернуть индекс $;} // $ file1 = indexFile ('Airlines.txt');// массив // $ file2 = indexFile ('africa.txt');// функция массива merge_common_keys () {$ arr = func_get_args ();$ num = func_num_args ();$ keys = array ();$ i = 0;for ($ i = 0; $ i <$ num; ++ $ i) {$ keys = array_merge ($ keys, array_keys ($ arr [$ i])));} $ keys = array_unique ($ keys);$ merged = array ();foreach ($ keys как $ key) {$ merged [$ key] = array ();for ($ i = 0; $ i <$ num; ++ $ i) {$ merged [$ key] [] = isset ($ arr [$ i] [$ key])? $ arr [$ i] [$ключ]: нуль;}} return $ merged;} for ($ i = 0; $ i <count ($ fileList); $ i ++) {$ fileArray [$ i] = indexFile ($ fileList [$ i]);} $ merged = call_user_func_array ('merge_common_keys', $ fileArray);$ searchQ = $ merged [$ searchWord];echo '<pre>'; print_r($searchQ); echo '';// echo "hello2";$ maxValue = 0;$ num_docs = 0;$ docID = array ();$ n = количество ($ searchQ);for ($ i = 0; $ i <$ n; $ i ++) {if ($ searchQ [$ i]> $ maxValue) {$ maxValue = $ searchQ [$ i];снята с охраны ($ DocId);$ docID [] = $ i;// print_r (количество ($ fileArray [$ я]));} else if ($ searchQ [$ i] == $ maxValue) {$ docID [] = $ i;} if (! empty ($ searchQ [$ i])) {$ num_docs ++;}} print_r ($ n);print_r ($ num_docs);print_r ($ DocId);if (is_array ($ docID)) {for ($ i = 0; $ i '. $ searchWord. ' найдено в документе '. $ fileList [$ docID [$ i]]. ''. $ maxValue. 'время'. $ множественное число. '. ');$ TF = $ maxValue;// $ TF2 = 1 + log ($ TF);echo "
$ TF2
";$ DF = $ num_docs;$ Non = $ n / $ num_docs;// echo "$ Non";$ IDF = (float) log10 ($ Non);$ TFxIDF = $ TF2 * $ IDF;// echo "$ TFxIDF";}} // 1,2 //file_put_contents("demo2.txt ", implode (" ", $ полезно_words));if (isset ($ _ GET ['search'])) {$ endtime = microtime ();$ endarray = explode ("", $ endtime);$ endtime = $ endarray [1] + $ endarray [0];$ totaltime = $ endtime - $ starttime;$ totaltime = round ($ totaltime, 5);эхо "

Эта страница загружена всего за $ секунд.

";}?>

1 Ответ

0 голосов
/ 03 ноября 2010

Используйте str_word_count для вычисления количества слов.

...